/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.estrutura;

import java.io.Serializable;
import java.util.ArrayList;

/**
 *
 * @author Thiago
 */
public abstract class Poligono implements Serializable {

    protected ArrayList<Ponto> listaPontos;
    protected ArrayList<Aresta> listaArestas;
    protected ArrayList<Face> listaFaces;
    protected boolean visivel;
    protected boolean ocultacao;
    protected int[] listaCor;

    public Poligono() {
        this.visivel = false;
        this.ocultacao = false;
        this.listaPontos = new ArrayList<>();
        this.listaArestas = new ArrayList<>();
        this.listaFaces = new ArrayList<>();
    }

    public ArrayList<Ponto> getListaPontos() {
        return listaPontos;
    }

    public ArrayList<Aresta> getListaArestas() {
        return listaArestas;
    }

    public ArrayList<Face> getListaFaces() {
        return listaFaces;
    }

    public void addPonto(Ponto p) {
        if (!this.listaPontos.contains(p)) {
            this.listaPontos.add(p);
        }
    }

    public void addAresta(Aresta a) {
        if (!this.listaArestas.contains(a)) {
            this.listaArestas.add(a);
        }
    }

    public void addFace(Face f) {
        if (!this.listaFaces.contains(f)) {
            this.listaFaces.add(f);
        }
    }

    public double[][] getMatriz() {
        int tamanho = 0;
        for (Face f : this.listaFaces) {
            for (Ponto p : f.getPontosDuplicados()) {
                tamanho++;
            }
        }
        double[][] matriz = new double[4][tamanho];
        int ind = 0;
        for (Face f : this.listaFaces) {
            for (Ponto p : f.getPontosDuplicados()) {
                matriz[0][ind] = p.getX();
                matriz[1][ind] = p.getY();
                matriz[2][ind] = p.getZ();
                matriz[3][ind++] = 1;
            }
        }
        return matriz;
    }
    
    public boolean isVisible(){
        return this.visivel;
    }
    
    public void setVisible(){
        this.visivel = true;
    }
    
    public void setInvisible(){
        this.visivel = false;
    }

    public int[] getListaCor() {
        return listaCor;
    }

    public void addListaCor(int pos, int valor) {
        this.listaCor[pos] = valor;
    }
    
    public void newListaCor(int tamanho){
        this.listaCor = new int[tamanho];
    }
    
    public void setOcultacao(boolean t){
        this.ocultacao = t;
    }
    
    public boolean getOcultacao(){
        return this.ocultacao;
    }
}
